package com.ruoyi.system.service.impl;

import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.domain.SdkSysRemindDomain;
import com.ruoyi.system.domain.SecurityValveAccount;
import com.ruoyi.system.entity.SysRemind;
import com.ruoyi.system.mapper.SysRemindMapper;
import com.ruoyi.system.service.SecurityValveAccountService;
import com.ruoyi.system.service.SysRemindService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 提醒表(SysRemind)表服务实现类
 *
 * @author makejava
 * @since 2022-12-17 15:16:40
 */
@Slf4j
@Service("sysRemindService")
public class SysRemindServiceImpl implements SysRemindService {
    @Resource
    private RedisCache redisCache;
    @Resource
    private InitServerImpl initServer;
    @Resource
    private SysRemindMapper sysRemindMapper;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public SysRemind queryById(Integer id) {
        return this.sysRemindMapper.queryById(id);
    }

    /**
     * 分页查询
     *
     * @param sysRemind 筛选条件
     * @return 查询结果
     */
    @Override
    public List<SysRemind> queryByPage(SysRemind sysRemind) {
        return this.sysRemindMapper.queryAllByLimit(sysRemind);
    }

    /**
     * 新增数据
     *
     * @param sysRemind 实例对象
     * @return 实例对象
     */
    @Override
    public SysRemind insert(SysRemind sysRemind) {
        this.sysRemindMapper.insert(sysRemind);
        return sysRemind;
    }

    @Override
    public SysRemind insert(String type, String content, Integer userId) {
        SysRemind sysRemind = new SysRemind();
        sysRemind.setRemindType(type);
        sysRemind.setRemindContent(content);
        sysRemind.setRemindUserId(userId);
        sysRemindMapper.insert(sysRemind);
        return sysRemind;
    }

    /**
     * 修改数据
     *
     * @param sysRemind 实例对象
     * @return 实例对象
     */
    @Override
    public SysRemind update(SysRemind sysRemind) {
        this.sysRemindMapper.update(sysRemind);
        return this.queryById(sysRemind.getId());
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer id) {
        return this.sysRemindMapper.deleteById(id) > 0;
    }

    @Override
    public void insertBatch(List<SysRemind> sysReminds) {
        sysRemindMapper.insertBatch(sysReminds);
    }

    //TODO  1.数据预处理 2.暂时只支持到天
    //0 0 5-15 * * ? 每天5-15点整点触发
    @Scheduled(cron = "0 0 5-15 * * ?")
    public void createTask() {
        String key = "SDK_SYS_REMIND";
        if (!redisCache.hasKey(key)) {
            log.error("台账扫描提醒 key未获取到数据:{}", key);
            return;
        }

        String value = redisCache.getCacheObject(key).toString();
        List<SdkSysRemindDomain> sdkSysRemindDomains = JSON.parseArray(value, SdkSysRemindDomain.class);
        if (CollectionUtils.isEmpty(sdkSysRemindDomains)) {
            log.error("台账扫描提醒 获取到的数据为空:{}", JSON.toJSON(sdkSysRemindDomains));
            return;
        }

        Map<String, SdkSysRemindDomain> sysRemindDomainMap = sdkSysRemindDomains.stream().collect(Collectors.toMap(SdkSysRemindDomain::getKey, el -> el, (e1, e2) -> e1));
        if (MapUtils.isNotEmpty(sysRemindDomainMap)) {
            return;
        }

        Date dateAddOne = dateAddOne(new Date());
        List<SysRemind> sysReminds = new ArrayList<>();
        //(优化方案,先计算条件,再查询,下次校验时间,加入索引)
        //安全阀台账提醒
        SecurityValveAccountService securityValveAccountService = initServer.getSecurityValveAccountService();
        SecurityValveAccount securityValveAccount = new SecurityValveAccount();
        List<SecurityValveAccount> securityValveAccounts = securityValveAccountService.queryAll(securityValveAccount);
        if (CollectionUtils.isNotEmpty(securityValveAccounts)) {

            //获取配置 (安全阀台账配置)
            SdkSysRemindDomain sdkSysRemindDomain = sysRemindDomainMap.get(SdkSysRemindDomain.SdkSysRemindKeyConfig.SECURITY_VALVE_ACCOUNT.name());
            if (null != sdkSysRemindDomain) {
                if (sdkSysRemindDomain.getType().equals(SdkSysRemindDomain.SdkSysRemindType.DAY.name())) {
                    securityValveAccounts.forEach(securityValveAccount1 -> {
                        String nextCheckReportDate = securityValveAccount1.getNextCheckReportDate();
                        Date parseDate = DateUtils.parseDate(nextCheckReportDate);
                        if (parseDate.equals(dateAddOne)) {
                            SysRemind sysRemind = new SysRemind();
                            //sysRemind.setRemindUserId();
                            sysRemind.setRemindContent("安全阀台账 有即将到达下次校验数据 元数据Id" + securityValveAccount1.getId());
                            sysRemind.setRemindType(SysRemind.TYPE_PROMPT);
                            sysReminds.add(sysRemind);
                        }
                    });
                } else {
                    log.error("获取配置 (安全阀台账配置) 当前只支持天");
                }
            }

        }

        //TODO 补全所有台账

        sysRemindMapper.insertBatch(sysReminds);
    }

    public static Date dateAddOne(Date date) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        //把日期往后增加一天,整数  往后推,负数往前移动
        calendar.add(Calendar.DATE, 1);
        //这个时间就是日期往后推一天的结果
        date = calendar.getTime();
        return date;

    }

}
